Sync trait
複数のスレッドから並列に扱われても、メモリ安全である gpt-5.icon
Rust の Sync トレイトは、
ある型 T への参照 &T を、複数スレッドから同時に安全に使ってよいか
を示す マーカートレイト です(中身のメソッドはありません)。
かなり重要なので、噛み砕いて説明します。
一言でいうと
T: Sync
⇔
&T を複数スレッドに共有しても データ競合が起きない
です。
よくセットで出てきます:
Send
→ 値そのものを別スレッドに渡していいか
Sync
→ 参照 (&T) を別スレッドに渡していいか
イメージ
Send: 所有権を move して OK?
Sync: 参照を share して OK?
例
✅ i32 は Sync
code:rust
let x = 10;
std::thread::scope(|s| {
s.spawn(|| println!("{}", x));
s.spawn(|| println!("{}", x));
});
i32 は不変なので、安全です。
❌ Cell<T> は Sync じゃない
code:rust
use std::cell::Cell;
let x = Cell::new(5);
// &x を複数スレッドに渡すとコンパイルエラー
Cell は内部可変性があり、ロックなしで書き換えられるので
複数スレッドだと危険 → !Sync
自動実装 (auto trait)
Sync は基本的に 自動で実装されます。
ルール:
型の中身が全部 Sync なら、その型も Sync
例えば:
code:rust
struct A {
x: i32,
y: String,
}
i32 も String も Sync
→ A も自動で Sync
Mutex / Arc はなぜ使える?
よく見る:
code:rust
Arc<Mutex<T>>
これは:
Mutex<T> が内部でロックする
Arc が参照カウントを atomic に管理する
ので、
code:text
Arc<Mutex<T>>: Sync
になります。
つまり:
👉 排他制御があるから Sync
かなり本質的な定義
Rust 的には:
code:text
T: Sync ⇔ &T: Send
「T が Sync なら、その参照は Send」
という定義です。
まとめ
✅ Sync とは
&T を複数スレッドで共有しても安全、という保証
🔑 ポイント
不変データ → だいたい Sync
内部可変性(Cell / RefCell) → だいたい !Sync
Mutex / RwLock → Sync にできる
中身が全部 Sync なら自動で Sync